<template>
  <view class="arrival-container">
    <!-- 到货单列表页面 -->
    <arrival-list
      v-if="showList"
      :arrival-list="arrivalList"
      :list-key="listKey"
      :loading="loading"
      @selectArrival="selectArrival"
      @scanCode="handleScanCode"
      @scrollToLower="scrollTolower"
      @loadOpenArrivalList="loadOpenArrivalList"
    />

    <!-- 扫码数据列表页面 -->
    <scan-list
      v-else-if="showScanList"
      :scan-items="scanItems"
      :arrival-list="arrivalList"
      :list-key="listKey"
      :loading="loading"
      @closeScanList="closeScanList"
      @scrollToLower="scrollTolower"
      @updateScanItem="updateScanItem"
      @updateArrivalList="updateArrivalList"
      @removeScanItem="removeScanItem"
    />

    <!-- 到货明细页面 -->
    <arrival-detail
      v-else
      :arrival-master="arrivalMaster"
      :items="items"
      :list-key="listKey"
      :loading="loading"
      @closeDetail="closeDetail"
      @scrollToLower="scrollTolower"
      @refreshList="loadOpenArrivalList"
    />

    <!-- 明细弹窗 -->
    <!-- 移除了这里对 detail-dialog 的引用，因为已经移到了 ArrivalDetail 组件中 -->
  </view>
</template>

<script>
import {
  getArrivalItems,
  getOpenArrivalVouchList,
  getArrivalDetails,
} from "@/api/work/wareHourse/arrival.js";
import user from "@/store/modules/user";
import ArrivalList from "./components/ArrivalList.vue";
import ScanList from "./components/ScanList.vue";
import ArrivalDetail from "./components/ArrivalDetail.vue";
// 移除了这里对 DetailDialog 的导入，因为已经移到了 ArrivalDetail 组件中

export default {
  components: {
    ArrivalList,
    ScanList,
    ArrivalDetail
    // 移除了这里对 DetailDialog 的注册，因为已经移到了 ArrivalDetail 组件中
  },
  data() {
    return {
      showList: true, // 是否显示到货单列表
      showScanList: false, // 是否显示扫码列表
      arrivalList: [], // 到货单列表
      items: [],
      scanItems: [], // 扫码数据列表
      listKey: Date.now(),
      param: {
        supplierName: null,
        searchKey: null,
      },
      loading: false,
      handlePdaScan: null,
      initFlag: false,
      arrivalMaster: {
        vName: "",          // 供应商名称
        vCode: "",          // 供应商编码
        dDate: "",          // 到货日期
        makeMan: "",        // 制单人
        whCode: "",         // 仓库编码
        details: [],        // 子表列表
        cCode: "",          // 单据号
        status: ""          // 单据状态
      }
      // 移除了 showDialog 和 currentItem，因为已经移到了 ArrivalDetail 组件中
    };
  },
  onLoad() {
    // 进入页面首先加载开立状态的到货单列表
    this.initScan();
    this.loadOpenArrivalList();
  },
  beforeDestroy() {
    if (this.initFlag) {
      let globalEvent = uni.requireNativePlugin('globalEvent');
      globalEvent.removeEventListener('iDataBarcodeEvent', this.handlePdaScan);
    }
  },
  methods: {
    // 加载开立状态的到货单列表
    loadOpenArrivalList() {
      this.loading = true;
      const userName = user.state.nickName;
      getOpenArrivalVouchList(userName).then(response => {
        if (response.code === 200) {
          this.arrivalList = response.data;
        } else {
          this.$modal.showToast('获取到货单列表失败: ' + (response.msg || ''));
        }
        this.loading = false;
      }).catch(err => {
        this.$modal.showToast('获取到货单列表失败: ' + err);
        this.loading = false;
      });
    },

    // 选择一个到货单进行处理
    selectArrival(item) {
      this.showList = false;
      this.showScanList = false; // 确保扫码列表页面不显示
      this.arrivalMaster = item;

      // 获取当前时间作为默认到货日期
      const now = new Date();
      this.arrivalMaster.dDate = now.toISOString().slice(0, 10);

      // 通过接口获取明细数据
      this.loading = true;
      getArrivalDetails(item.id).then(response => {
        if (response.code === 200) {
          this.items = response.data.map(detail => ({
            ...detail
          }));
        } else {
          this.$modal.showToast('获取明细失败: ' + (response.msg || ''));
          this.items = [];
        }
        this.loading = false;
      }).catch(err => {
        this.$modal.showToast('获取明细失败: ' + err);
        this.items = [];
        this.loading = false;
      });
    },

    // 初始化扫码功能
    initScan() {
      let barcodeModel = uni.requireNativePlugin("iData-BarcodePlugin-BarcodeModule")
      barcodeModel.initScan((ret) => {
        if (ret.code === 'success') {
          console.log("初始化成功");
        }
      });
      barcodeModel.setOutputMode(4,(ret) => {
        if (ret.code === 'success') {
          console.log("模式设置成功");
        }
      });
      let globalEvent = uni.requireNativePlugin('globalEvent');
      let that = this;
      this.handlePdaScan = function(res) {
        if (!user.state.nickName) {
          that.$modal.msgError("请登录后操作");
          return;
        }
        that.addByScan(res.barcode);
      }
      globalEvent.addEventListener('iDataBarcodeEvent', this.handlePdaScan);
    },

    // 处理扫码事件
    handleScanCode(result) {
      if (!user.state.nickName) {
        this.$modal.msgError("请登录后操作");
        return;
      }
      this.addByScan(result);
    },

    // 扫码添加物料
    scanCode() {
      uni.scanCode({
        success: (res) => {
          this.addByScan(res.result);
        },
        fail: (err) => {
          this.$modal.showToast('扫码失败', err)
        }
      });
    },

    // 处理扫码结果并添加到明细
    addByScan(result) {
      if (!result) {
        this.$modal.showToast('扫码内容为空');
        return;
      }

      // 解析扫码内容，格式应为：物料编码#批次#仓库编码#采购订单号#...
      const datas = result.split("#");
      if (datas.length < 4) {
        this.$modal.showToast('扫码内容格式不正确');
        return;
      }

      const invCode = datas[0];
      const batch = datas[1];
      const poId = datas[3];

      // 构造查询参数获取物料信息
      const queryParam = {
        cInvCode: invCode,
        cPOID: poId
      };

      this.loading = true;
      getArrivalItems(queryParam).then(response => {
        if (response.code === 200 && response.data) {
          // 清除之前的扫码数据
          this.scanItems = [];

          // 根据返回的数据创建扫码项目
          response.data.forEach(item => {
            const scanItem = {
              ...item,
              cBatch: batch,
              whCode: item.whCode,
              revQty: item.availableQty,
              isBatch: item.isBatch
            };
            this.scanItems.push(scanItem);
          });
          this.listKey = Date.now();

          // 切换到扫码列表页面
          this.showList = false;
          this.showScanList = true;
        } else {
          this.$modal.showToast('未找到物料信息: ' + (response.msg || ''));
        }
        this.loading = false;
      }).catch(err => {
        this.$modal.showToast('获取物料信息失败: ' + err);
        this.loading = false;
      });
    },

    // 验证数量
    checkQty(item) {
      const revQty = parseFloat(item.revQty);
      const availableQty = parseFloat(item.availableQty);

      if (isNaN(revQty) || revQty <= 0) {
        this.$modal.showToast('到货数量必须大于0');
        return false;
      }

      if (revQty > availableQty) {
        this.$modal.showToast('到货数量不能超过可收货数量');
        item.revQty = '';
        return false;
      }

      return true;
    },

    // 保存到货单
    saveArrival() {
      // 验证必填信息
      if (this.items.length === 0) {
        this.$modal.showToast('请至少添加一条明细');
        return;
      }

      // 验证每条明细
      for (let i = 0; i < this.items.length; i++) {
        const item = this.items[i];
        if (!this.checkQty(item)) {
          return;
        }

        // 如果是批次管理物料，必须填写批次号
        if (item.isBatch === '1' && (!item.cBatch || item.cBatch.trim() === '')) {
          this.$modal.showToast(`第${i+1}行物料需要填写批次号`);
          return;
        }
      }

      // 构建提交数据
      const arrivalData = {
        cCode: this.arrivalMaster.cCode, // 单据号
        cPOID: this.items[0].cPOID, // 取第一条记录的采购订单号作为主表订单号
        dDate: this.arrivalMaster.dDate,
        makeMan: this.$store.getters.name, // 从用户信息中获取制单人
        whCode: this.items[0].whCode, // 取第一条记录的仓库编码
        details: this.items.map(item => ({
          iPOsID: item.iPOsID,
          revQty: parseFloat(item.revQty),
          cBatch: item.cBatch || null,
          whCode: item.whCode
        }))
      };

      // 提交数据
      saveArrivalVouch(arrivalData).then(response => {
        if (response.code === 200) {
          this.$modal.showToast('保存成功');
          // 清空列表
          this.items = [];
          this.listKey = Date.now();
          // 返回到货单列表
          this.showList = true;
        } else {
          this.$modal.showToast('保存失败: ' + (response.msg || ''));
        }
      }).catch(err => {
        this.$modal.showToast('保存失败: ' + err);
      });
    },

    // 关闭明细页面
    closeDetail() {
      this.showList = true;
    },

    // 滚动加载（暂时留空，后续可根据需要实现分页）
    scrollTolower() {
      // 暂时不需要滚动加载
    },

    // 关闭扫码列表页面
    closeScanList() {
      this.showList = true;
      this.showScanList = false;
      // 清空扫码列表
      this.scanItems = [];
    },

    // 更新扫码项（从ScanList组件接收）
    updateScanItem(item) {
      // 可以在这里处理扫码项更新后的逻辑
      console.log('扫码项已更新:', item);
    },

    updateArrivalList(updatedArrivalList) {
      // 更新到货单主表
      this.arrivalList = updatedArrivalList;
    },

    // 移除已保存的扫码项（从ScanList组件接收）
    removeScanItem(item) {
      // 从scanItems中移除已保存的项目
      const index = this.scanItems.findIndex(scanItem => scanItem.iPOsID === item.iPOsID);
      if (index > -1) {
        this.scanItems.splice(index, 1);
      }

      // 如果没有扫码项了，则返回到货单列表
      if (this.scanItems.length === 0) {
        this.closeScanList();
      } else {
        // 更新列表key以刷新界面
        this.listKey = Date.now();
      }

      // 更新到货单列表
      this.loadOpenArrivalList();
    }
  }
};
</script>

<style>
.arrival-container {
  padding: 20rpx;
}
</style>
